package wsz.loadbalance;

import org.apache.dubbo.common.URL;
import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.RpcException;
import org.apache.dubbo.rpc.cluster.LoadBalance;

import java.util.List;

/**
 * TODO：自定义负载均衡，选取ip、port最小的服务
 *
 * @author wsz
 * @desc：
 * @date 2021/12/13
 */
public class OnlyFirstLoadBalancer implements LoadBalance {
    @Override
    public <T> Invoker<T> select(List<Invoker<T>> list, URL url, Invocation invocation) throws RpcException {
        // 所有服务提供者：按照ip+port排序，选择第一个
        return list.stream().sorted((i1, i2) -> {
            URL url1 = i1.getUrl();
            URL url2 = i2.getUrl();
            int compare = url1.getIp().compareTo(url2.getIp());
            if (compare == 0) {
                // ip相等比较端口
                return Integer.compare(i1.getUrl().getPort(),i2.getUrl().getPort());
            }
            return compare;
        }).findFirst().get();
    }
}
